www.gusucode.com > VC++ Windows不规则窗体编程的实例演示-源码程序 > VC++ Windows不规则窗体编程的实例演示-源码程序/code/DlgBmp.cpp
// DlgBmp.cpp : implementation file // Download by http://www.NewXing.com #include "stdafx.h" #include "Irregular.h" #include "DlgBmp.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CDlgBmp dialog CDlgBmp::CDlgBmp(CWnd* pParent /*=NULL*/) : CDlgBase(CDlgBmp::IDD, pParent) { //{{AFX_DATA_INIT(CDlgBmp) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT } void CDlgBmp::DoDataExchange(CDataExchange* pDX) { CDlgBase::DoDataExchange(pDX); //{{AFX_DATA_MAP(CDlgBmp) // NOTE: the ClassWizard will add DDX and DDV calls here //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CDlgBmp, CDlgBase) //{{AFX_MSG_MAP(CDlgBmp) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CDlgBmp message handlers BOOL CDlgBmp::OnInitDialog() { CDlgBase::OnInitDialog(); // TODO: Add extra initialization here CClientDC dc(this); SetupRegion(&dc,m_bmp,RGB(0,0,255)); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CDlgBmp::SetupRegion(CDC *pDC, CBitmap &cBitmap, COLORREF TransColor) { CDC memDC; //创建与传入DC兼容的临时DC memDC.CreateCompatibleDC(pDC); CBitmap *pOldMemBmp=NULL; //将位图选入临时DC pOldMemBmp=memDC.SelectObject(&cBitmap); CRgn wndRgn; //创建总的窗体区域,初始region为0 wndRgn.CreateRectRgn(0,0,0,0); BITMAP bit; cBitmap.GetBitmap (&bit);//取得位图参数,这里要用到位图的长和宽 int y; for(y=0;y<=bit.bmHeight ;y++) { CRgn rgnTemp; //保存临时region int iX = 0; do { //跳过透明色找到下一个非透明色的点. while (iX <= bit.bmWidth && memDC.GetPixel(iX, y) == TransColor) iX++; //记住这个起始点 int iLeftX = iX; //寻找下个透明色的点 while (iX <= bit.bmWidth && memDC.GetPixel(iX, y) != TransColor) ++iX; //创建一个包含起点与重点间高为1像素的临时“region” rgnTemp.CreateRectRgn(iLeftX, y, iX, y+1); //合并到主"region". wndRgn.CombineRgn(&wndRgn, &rgnTemp, RGN_OR); //删除临时"region",否则下次创建时和出错 rgnTemp.DeleteObject(); }while(iX <bit.bmWidth ); iX = 0; } if(pOldMemBmp) memDC.SelectObject(pOldMemBmp); CWnd * pWnd = pDC->GetWindow(); pWnd->SetWindowRgn(wndRgn,TRUE); pWnd->SetForegroundWindow(); }